package menu.menu;

import java.util.Collection;

/**
 * Interfaz que representa un item cualquiera del menú en el tablet y el sistema.
 * @author JSR
 * @version $Id: IItem.java 60 2010-10-06 02:35:16Z batianusrey $
 */
public interface IItem
{
    //---------------------------------------
    // Métodos
    //---------------------------------------

    /**
     * Obtiene las anotaciones extras del item.<br>
     * Pueden ser formas especiales de interacción.
     * @return anotacionesExtra
     */
    public String getAnotacionesExtra();

    /**
     * Obtiene la descripción del item
     * @return descripción
     */
    public String getDescripcionItem();

    /**
     * Obtiene los deseos del item
     * @return deseosPreparacione
     */
    public String getDeseosPreparacion();

    /**
     * Establece los deseos de preparación para un item
     * @param deseosPreparacion
     */
    public void setDeseosPreparacion( String deseosPreparacion );

    /**
     * Obtiene el estado actaul del item
     * @return estadoActual
     */
    public Constantes.EstadosPedido getEstadoActualItem();

    /**
     * Adelanta el estado actual del item en uno.
     */
    public void adelantarEstadoActualItem();

    /**
     * Obtiene la lista de ingredientes del item
     * @return ingredientes
     */
    public Collection<Ingrediente> getListaIngredientes();

    /**
     * Obtiene el nombre del item
     * @return nombre
     */
    public String getNombreItem();

    /**
     * Obtiene el precio del item con IVA
     * @return precioSinIVA
     */
    public double getPrecioConIVA();

    /**
     * Obtiene el precio del item sin IVA
     * @return precioConIVA
     */
    public double getPrecioSinIVA();

    /**
     * Indica si el item actual está seleccionado en la bandeja
     * @return seleccionado
     */
    public boolean isSeleccionado();

    /**
     * Obtener el tipo de item que es
     * @return tipoDeItem
     */
    public Constantes.TiposItem getTipoDeItem();

    /**
     * Cambia el estado de selección.<br>
     * A <code>true</code> si es <code>false</code> y viceversa.
     */
    public void cambiarEstadoSeleccionado();

    /**
     * Cambia el estado de un ingrediente dado su nombre.<br>
     * <b>Pre:</b> El nombre del ingrediente existe en la lista de ingredientes del item.<br>
     * <b>Pos:</b> El estado del ingrediente cambia a <code>true</code> si es <code>false</code> y viceversa.
     * @param nombreIngrediente
     */
    public void cambiarEstadoSeleccionadoDeIngrediente( String nombreIngrediente );

    /**
     * Resetear el item.<br>
     * Implica resetear todos los atributos de pedido del item a su estado por default(queda como si se le hiciera un new)
     */
    public void resetearAtributosDePedido();

    /**
     * Clona el item.<br>
     * <b>Pre:</b> Ninguno.<br>
     * <b>Pos:</b> Se clona el item y se deja su estado por default (queda como si se le hiciera un new).
     */
    public IItem clonarItem();
}
